package com.condominio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import com.condominio.excepcion.DAOExcepcion;
import com.condominio.modelo.Visitante;
import com.condominio.util.ConexionBD;

public class VisitanteDAO extends BaseDAO {

	public int insertVisitante(Visitante oVisitante) throws DAOExcepcion {
		int i = 0;
		System.out.println("VisitanteDAO: insertVisitante(Visitante oVisitante)");
		String query = "INSERT INTO VISITANTE(NoVisitante, NoApePaterno, "
				+ "NoApeMaterno, NuDni, FeNacimiento, NuTelefono, FlEstadoCivil)" +
						" VALUES (?, ?, ?, ?, ?, ?, ?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			if (findVisitante(oVisitante.getDni()) != null) {
				throw new DAOExcepcion("Nro Dni del visitante ya existe.");			
			}
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, oVisitante.getNombre());
			stmt.setString(2, oVisitante.getApellidoPaterno());
			stmt.setString(3, oVisitante.getApellidoMaterno());
			stmt.setString(4, oVisitante.getDni());
			stmt.setString(5, oVisitante.getFechaNacimiento());
			stmt.setString(6, oVisitante.getNroTelefono());
			stmt.setString(7, oVisitante.getEstadoCivil());
			i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException();
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return i;
	}

	public Visitante findVisitante(String nuDni) throws DAOExcepcion {
		System.out.println("VisitanteDAO: findVisitante(String nuDNI)");
		Visitante oVisitante = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM VISITANTE WHERE NuDni = ?";
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, nuDni);
			rs = stmt.executeQuery();
			if (rs.next()) {
				oVisitante = new Visitante();
				oVisitante.setCodigo(rs.getInt("CoVisitante"));
				oVisitante.setNombre(rs.getString("NoVisitante"));
				oVisitante.setApellidoPaterno(rs.getString("NoApePaterno"));
				oVisitante.setApellidoMaterno(rs.getString("NoApeMaterno"));
				oVisitante.setDni(rs.getString("NuDni"));
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return oVisitante;
	}

	public Visitante findVisitante(int coVisitante) throws DAOExcepcion {
		System.out.println("VisitanteDAO: findVisitante(int coVisitante)");
		Visitante oVisitante = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM VISITANTE WHERE CoVisitante = ?";
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, coVisitante);
			rs = stmt.executeQuery();
			if (rs.next()) {
				oVisitante = new Visitante();
				oVisitante.setCodigo(rs.getInt("CoVisitante"));
				oVisitante.setNombre(rs.getString("NoVisitante"));
				oVisitante.setApellidoPaterno(rs.getString("NoApePaterno"));
				oVisitante.setApellidoMaterno(rs.getString("NoApeMaterno"));
				oVisitante.setDni(rs.getString("NuDni"));
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return oVisitante;
	}

	public int updateVisitante(Visitante oVisitante) throws DAOExcepcion {
		int i = 0;
		System.out.println("updateVisitante(Visitante oVisitante)");
		String query = "UPDATE VISITANTE SET NoVisitante =  ?, NoApePaterno = ?,  " +
				"NoApeMaterno = ?, NuDni = ?, FeNacimiento = ?, NuTelefono = ?, " +
				"FlEstadoCivil = ? WHERE CoVisitante = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {			
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, oVisitante.getNombre());
			stmt.setString(2, oVisitante.getApellidoPaterno());
			stmt.setString(3, oVisitante.getApellidoMaterno());
			stmt.setString(4, oVisitante.getDni());
			stmt.setString(5, oVisitante.getFechaNacimiento());
			stmt.setString(6, oVisitante.getNroTelefono());
			stmt.setString(7, oVisitante.getEstadoCivil());
			stmt.setInt(8, oVisitante.getCodigo());
			i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException();
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return i;
	}

	
	public Collection<Visitante> listar() throws DAOExcepcion {
		System.out.println("VisitanteDAO: listar()");
		Collection<Visitante> c = new ArrayList<Visitante>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.getConexion();
			String query = "SELECT CoVisitante, NoVisitante, NoApePaterno, NoApeMaterno, NuDni, FeNacimiento, NuTelefono, FlEstadoCivil from Visitante";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Visitante oVisitante = new Visitante();

				oVisitante.setCodigo(rs.getInt("CoVisitante"));
				oVisitante.setNombre(rs.getString("NoVisitante"));
				oVisitante.setApellidoPaterno(rs.getString("NoApePaterno"));
				oVisitante.setApellidoMaterno(rs.getString("NoApeMaterno"));
				oVisitante.setDni(rs.getString("NuDni"));
				oVisitante.setFechaNacimiento(rs.getString("FeNacimiento"));
				oVisitante.setNroTelefono(rs.getString("NuTelefono"));
				oVisitante.setEstadoCivil(rs.getString("FlEstadoCivil"));		
				
				c.add(oVisitante);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}		
	
}
